import random
import importlib
import sys
importlib.reload(sys)
from django import http
from django.shortcuts import render
from random import randint
# Create your views here.
from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection
from django import http
from random import randint

from meiduo_mall.libs.captcha.captcha import captcha
from meiduo_mall.utils.response_code import RETCODE
# from meiduo_mall.libs.yuntongxun.sms import CCP
from . import constants
from celery_tasks.sms.tasks import send_sms_code

import logging

logger = logging.getLogger('django')

class ImageCodeView(View):
    """图形验证码"""
    def get(self, request, uuid):
        # 使用sdk 生成图形验证码
        # name：唯一标识
        # text：图形验证码中的字符内容
        # imgge_bytes: 图片bytes类型数据
        name,text,image_bytes = captcha.generate_captcha()

        # 创建redis连接对象
        redis_conn = get_redis_connection('verify_code')
        # 把图形验证码字符内容存储到redis中 为后面短信发验证码时，可以进行校正
        redis_conn.setex(uuid,300,text)
        # 响应 MIME
        return http.HttpResponse(image_bytes,content_type='image/png')


class SMSCodeView(View):
    """f发送短信验证码"""
    # this.host + '/sms_codes/'+ this.mobile + '/?image_code=' + this.image_code + '&uuid=' + this.uuid;
    def get(self,request,mobile):
        # 创建redis连接诶对象
        redis_coon = get_redis_connection('verify_code')
        # 获得此手机号是否发送国短信标记
        send_flag = redis_coon.get('send_flag_%s' % mobile)
        if send_flag :
            return http.JsonResponse({'code':RETCODE.THROTTLINGERR,'errmsg':'频繁发送短信'})
        # 接收前端数据
        image_code_client = request.GET.get('image_code')
        uuid = request.GET.get('uuid')

        # 校验
        if all([image_code_client,uuid]) is False:
            return  http.HttpResponseForbidden('缺少必传参数')

        # 获得redis中的图形验证码
        image_code_server = redis_coon.get(uuid)
        # 直接将redis中用过的图形验证码删除（让每个图形验证码都是一次性）
        redis_coon.delete(uuid)

        # 判断图形验证码有没有过期
        if image_code_server is None:
            return http.JsonResponse({'code': RETCODE.IMAGECODEERR, 'errmsg': '图形验证码已过期'})

        # 判断图形验证码有没有过期
        if image_code_client.lower() != image_code_server.decode().lower():
            return http.JsonResponse({'code':RETCODE.IMAGECODEERR,'errmsg':'图片验证码输入错误'})

        # 随即生成一个六位位数来当短信验证码
        sms_code = '%06d' % randint(0,999999)
        logger.info(sms_code)

        # 创建管道对象（管道作用：就是将多次的redis指令合并到一起，一次全部执行）
        p1 = redis_coon.pipeline()
        # 把短信验证码储存到redis中以备后期注册时校验
        # redis_conn.setex('sms_code_%s' % mobile, constants.SMS_CODE_EXPIRE_REDIS, sms_code)
        p1.setex('sms_code_%s' % mobile, constants.SMS_CODE_EXPIRE_REDIS, sms_code)
        # 发送多短信后向redis储存一个此手机号发过短信的标记
        # redis_coon.setex('send_falg_%s' % mobile, 60 , 1)
        p1.setex('send_flag_%s' % mobile ,60 ,1)

        # 执行管道
        p1.execute()


        # 利用第三方容联云发短信
        # CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_EXPIRE_REDIS // 60], 1)
        send_sms_code.delay(mobile,sms_code)
        # 触发异步任务，将异步任务添加到仓库

        # 响应
        return http.JsonResponse({'code':RETCODE.OK,'errmsg':"ok"})